home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Examples / aux / samples / prim.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  11.2 KB  |  542 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include "tk.h"
  6.  
  7.  
  8. #define PIXEL_CENTER(x) ((long)(x) + 0.5)
  9.  
  10. #define GAP 10
  11. #define ROWS 3
  12. #define COLS 4
  13.  
  14. #define OPENGL_WIDTH 48
  15. #define OPENGL_HEIGHT 13
  16.  
  17.  
  18. GLenum rgb, doubleBuffer, directRender, windType;
  19. GLint windW, windH;
  20.  
  21. GLenum mode1, mode2;
  22. GLint boxW, boxH;
  23. GLubyte OpenGL_bits[] = {
  24.    0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 
  25.    0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
  26.    0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01, 
  27.    0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
  28.    0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01, 
  29.    0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
  30.    0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00, 
  31.    0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
  32.    0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00, 
  33.    0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
  34.    0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e, 
  35.    0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
  36.    0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 
  37. };
  38.  
  39.  
  40. static void Init(void)
  41. {
  42.  
  43.     mode1 = GL_FALSE;
  44.     mode2 = GL_TRUE;
  45. }
  46.  
  47. static void Reshape(int width, int height)
  48. {
  49.  
  50.     windW = (GLint)width;
  51.     windH = (GLint)height;
  52. }
  53.  
  54. static void RotateColorMask(void)
  55. {
  56.     static GLint rotation = 0;
  57.     
  58.     rotation = (rotation + 1) & 0x3;
  59.     switch (rotation) {
  60.       case 0:
  61.     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  62.     glIndexMask( 0xff );
  63.     break;
  64.       case 1:
  65.     glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
  66.     glIndexMask(0xFE);
  67.     break;
  68.       case 2:
  69.     glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
  70.     glIndexMask(0xFD);
  71.     break;
  72.       case 3:
  73.     glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
  74.     glIndexMask(0xFB);
  75.     break;
  76.     }
  77. }
  78.  
  79. static GLenum Key(int key, GLenum mask)
  80. {
  81.  
  82.     switch (key) {
  83.       case TK_ESCAPE:
  84.     tkQuit();
  85.       case TK_1:
  86.     mode1 = !mode1;
  87.     break;
  88.       case TK_2:
  89.     mode2 = !mode2;
  90.     break;
  91.       case TK_3:
  92.     RotateColorMask();
  93.     break;
  94.       default:
  95.     return GL_FALSE;
  96.     }
  97.     return GL_TRUE;
  98. }
  99.  
  100. static void Viewport(GLint row, GLint column)
  101. {
  102.     GLint x, y;
  103.  
  104.     boxW = (windW - (COLS + 1) * GAP) / COLS;
  105.     boxH = (windH - (ROWS + 1) * GAP) / ROWS;
  106.  
  107.     x = GAP + column * (boxW + GAP);
  108.     y = GAP + row * (boxH + GAP);
  109.  
  110.     glViewport(x, y, boxW, boxH);
  111.  
  112.     glMatrixMode(GL_PROJECTION);
  113.     glLoadIdentity();
  114.     glOrtho(-boxW/2, boxW/2, -boxH/2, boxH/2, 0.0, 1.0);
  115.     glMatrixMode(GL_MODELVIEW);
  116.  
  117.     glEnable(GL_SCISSOR_TEST);
  118.     glScissor(x, y, boxW, boxH);
  119. }
  120.  
  121. static void Points(void)
  122. {
  123.     GLint i;
  124.  
  125.     glBegin(GL_POINTS);
  126.     TK_SETCOLOR(windType, TK_WHITE);
  127.     glVertex2i(0, 0);
  128.     for (i = 1; i < 8; i++) {
  129.         GLint j = i * 2;
  130.         TK_SETCOLOR(windType, TK_BLACK+i);
  131.         glVertex2i(-j, -j);
  132.         glVertex2i(-j, 0);
  133.         glVertex2i(-j, j);
  134.         glVertex2i(0, j);
  135.         glVertex2i(j, j);
  136.         glVertex2i(j, 0);
  137.         glVertex2i(j, -j);
  138.         glVertex2i(0, -j);
  139.     }
  140.     glEnd();
  141. }
  142.  
  143. static void Lines(void)
  144. {
  145.     GLint i;
  146.  
  147.     glPushMatrix();
  148.  
  149.     glTranslatef(-12, 0, 0);
  150.     for (i = 1; i < 8; i++) {
  151.     TK_SETCOLOR(windType, TK_BLACK+i);
  152.     glBegin(GL_LINES);
  153.         glVertex2i(-boxW/4, -boxH/4);
  154.         glVertex2i(boxW/4, boxH/4);
  155.     glEnd();
  156.     glTranslatef(4, 0, 0);
  157.     }
  158.  
  159.     glPopMatrix();
  160.  
  161.     glBegin(GL_LINES);
  162.     glVertex2i(0, 0);
  163.     glEnd();
  164. }
  165.  
  166. static void LineStrip(void)
  167. {
  168.     glBegin(GL_LINE_STRIP);
  169.     TK_SETCOLOR(windType, TK_RED);
  170.     glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
  171.     TK_SETCOLOR(windType, TK_GREEN);
  172.     glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
  173.     TK_SETCOLOR(windType, TK_BLUE);
  174.     glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
  175.     TK_SETCOLOR(windType, TK_WHITE);
  176.     glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
  177.     glEnd();
  178.  
  179.     glBegin(GL_LINE_STRIP);
  180.     glVertex2i(0, 0);
  181.     glEnd();
  182. }
  183.  
  184. static void LineLoop(void)
  185. {
  186.  
  187.     glBegin(GL_LINE_LOOP);
  188.     TK_SETCOLOR(windType, TK_RED);
  189.     glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
  190.     TK_SETCOLOR(windType, TK_GREEN);
  191.     glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
  192.     TK_SETCOLOR(windType, TK_BLUE);
  193.     glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
  194.     TK_SETCOLOR(windType, TK_WHITE);
  195.     glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
  196.     glEnd();
  197.  
  198.     glEnable(GL_LOGIC_OP);
  199.     glLogicOp(GL_XOR);
  200.  
  201.     glEnable(GL_BLEND);
  202.     glBlendFunc(GL_ONE, GL_ONE);
  203.  
  204.     TK_SETCOLOR(windType, TK_MAGENTA);
  205.     glBegin(GL_LINE_LOOP);
  206.     glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(-boxH/8));
  207.     glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8));
  208.     glEnd();
  209.     glBegin(GL_LINE_LOOP);
  210.     glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8+5));
  211.     glVertex2f(PIXEL_CENTER(boxW/8), PIXEL_CENTER(boxH/8+5));
  212.     glEnd();
  213.     glDisable(GL_LOGIC_OP);
  214.     glDisable(GL_BLEND);
  215.  
  216.     TK_SETCOLOR(windType, TK_GREEN);
  217.     glBegin(GL_POINTS);
  218.     glVertex2i(0, 0);
  219.     glEnd();
  220.  
  221.     glBegin(GL_LINE_LOOP);
  222.     glVertex2i(0, 0);
  223.     glEnd();
  224. }
  225.  
  226. static void Bitmap(void)
  227. {
  228.  
  229.     glBegin(GL_LINES);
  230.     TK_SETCOLOR(windType, TK_GREEN);
  231.     glVertex2i(-boxW/2, 0);
  232.     glVertex2i(boxW/2, 0);
  233.     glVertex2i(0, -boxH/2);
  234.     glVertex2i(0, boxH/2);
  235.     TK_SETCOLOR(windType, TK_RED);
  236.     glVertex2i(0, -3);
  237.     glVertex2i(0, -3+OPENGL_HEIGHT);
  238.     TK_SETCOLOR(windType, TK_BLUE);
  239.     glVertex2i(0, -3);
  240.     glVertex2i(OPENGL_WIDTH, -3);
  241.     glEnd();
  242.  
  243.     TK_SETCOLOR(windType, TK_GREEN);
  244.  
  245.     glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
  246.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  247.  
  248.     glRasterPos2i(0, 0);
  249.     glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0.0, 0.0, OpenGL_bits);
  250. }
  251.  
  252. static void Triangles(void)
  253. {
  254.     glBegin(GL_TRIANGLES);
  255.     TK_SETCOLOR(windType, TK_GREEN);
  256.     glVertex2i(-boxW/4, -boxH/4);
  257.     TK_SETCOLOR(windType, TK_RED);
  258.     glVertex2i(-boxW/8, -boxH/16);
  259.     TK_SETCOLOR(windType, TK_BLUE);
  260.     glVertex2i(boxW/8, -boxH/16);
  261.  
  262.     TK_SETCOLOR(windType, TK_GREEN);
  263.     glVertex2i(-boxW/4, boxH/4);
  264.     TK_SETCOLOR(windType, TK_RED);
  265.     glVertex2i(-boxW/8, boxH/16);
  266.     TK_SETCOLOR(windType, TK_BLUE);
  267.     glVertex2i(boxW/8, boxH/16);
  268.     glEnd();
  269.  
  270.     glBegin(GL_TRIANGLES);
  271.     glVertex2i(0, 0);
  272.     glVertex2i(-100, 100);
  273.     glEnd();
  274. }
  275.  
  276. static void TriangleStrip(void)
  277. {
  278.  
  279.     glBegin(GL_TRIANGLE_STRIP);
  280.     TK_SETCOLOR(windType, TK_GREEN);
  281.     glVertex2i(-boxW/4, -boxH/4);
  282.     TK_SETCOLOR(windType, TK_RED);
  283.     glVertex2i(-boxW/4, boxH/4);
  284.     TK_SETCOLOR(windType, TK_BLUE);
  285.     glVertex2i(0, -boxH/4);
  286.     TK_SETCOLOR(windType, TK_WHITE);
  287.     glVertex2i(0, boxH/4);
  288.     TK_SETCOLOR(windType, TK_CYAN);
  289.     glVertex2i(boxW/4, -boxH/4);
  290.     TK_SETCOLOR(windType, TK_YELLOW);
  291.     glVertex2i(boxW/4, boxH/4);
  292.     glEnd();
  293.  
  294.     glBegin(GL_TRIANGLE_STRIP);
  295.     glVertex2i(0, 0);
  296.     glVertex2i(-100, 100);
  297.     glEnd();
  298. }
  299.  
  300. static void TriangleFan(void)
  301. {
  302.     GLint vx[8][2];
  303.     GLint x0, y0, x1, y1, x2, y2, x3, y3;
  304.     GLint i;
  305.  
  306.     y0 = -boxH/4;
  307.     y1 = y0 + boxH/2/3;
  308.     y2 = y1 + boxH/2/3;
  309.     y3 = boxH/4;
  310.     x0 = -boxW/4;
  311.     x1 = x0 + boxW/2/3;
  312.     x2 = x1 + boxW/2/3;
  313.     x3 = boxW/4;
  314.  
  315.     vx[0][0] = x0; vx[0][1] = y1;
  316.     vx[1][0] = x0; vx[1][1] = y2;
  317.     vx[2][0] = x1; vx[2][1] = y3;
  318.     vx[3][0] = x2; vx[3][1] = y3;
  319.     vx[4][0] = x3; vx[4][1] = y2;
  320.     vx[5][0] = x3; vx[5][1] = y1;
  321.     vx[6][0] = x2; vx[6][1] = y0;
  322.     vx[7][0] = x1; vx[7][1] = y0;
  323.  
  324.     glBegin(GL_TRIANGLE_FAN);
  325.     TK_SETCOLOR(windType, TK_WHITE);
  326.     glVertex2i(0, 0);
  327.     for (i = 0; i < 8; i++) {
  328.         TK_SETCOLOR(windType, TK_WHITE-i);
  329.         glVertex2iv(vx[i]);
  330.     }
  331.     glEnd();
  332.  
  333.     glBegin(GL_TRIANGLE_FAN);
  334.     glVertex2i(0, 0);
  335.     glVertex2i(-100, 100);
  336.     glEnd();
  337. }
  338.  
  339. static void Rects(void)
  340. {
  341.  
  342.     TK_SETCOLOR(windType, TK_GREEN);
  343.     glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4);
  344. }
  345.  
  346. static void Polygons(void)
  347. {
  348.     GLint vx[8][2];
  349.     GLint x0, y0, x1, y1, x2, y2, x3, y3;
  350.     GLint i;
  351.  
  352.     y0 = -boxH/4;
  353.     y1 = y0 + boxH/2/3;
  354.     y2 = y1 + boxH/2/3;
  355.     y3 = boxH/4;
  356.     x0 = -boxW/4;
  357.     x1 = x0 + boxW/2/3;
  358.     x2 = x1 + boxW/2/3;
  359.     x3 = boxW/4;
  360.  
  361.     vx[0][0] = x0; vx[0][1] = y1;
  362.     vx[1][0] = x0; vx[1][1] = y2;
  363.     vx[2][0] = x1; vx[2][1] = y3;
  364.     vx[3][0] = x2; vx[3][1] = y3;
  365.     vx[4][0] = x3; vx[4][1] = y2;
  366.     vx[5][0] = x3; vx[5][1] = y1;
  367.     vx[6][0] = x2; vx[6][1] = y0;
  368.     vx[7][0] = x1; vx[7][1] = y0;
  369.  
  370.     glBegin(GL_POLYGON);
  371.     for (i = 0; i < 8; i++) {
  372.         TK_SETCOLOR(windType, TK_WHITE-i);
  373.         glVertex2iv(vx[i]);
  374.     }
  375.     glEnd();
  376.  
  377.     glBegin(GL_POLYGON);
  378.     glVertex2i(0, 0);
  379.     glVertex2i(100, 100);
  380.     glEnd();
  381. }
  382.  
  383. static void Quads(void)
  384. {
  385.  
  386.     glBegin(GL_QUADS);
  387.     TK_SETCOLOR(windType, TK_GREEN);
  388.     glVertex2i(-boxW/4, -boxH/4);
  389.     TK_SETCOLOR(windType, TK_RED);
  390.     glVertex2i(-boxW/8, -boxH/16);
  391.     TK_SETCOLOR(windType, TK_BLUE);
  392.     glVertex2i(boxW/8, -boxH/16);
  393.     TK_SETCOLOR(windType, TK_WHITE);
  394.     glVertex2i(boxW/4, -boxH/4);
  395.  
  396.     TK_SETCOLOR(windType, TK_GREEN);
  397.     glVertex2i(-boxW/4, boxH/4);
  398.     TK_SETCOLOR(windType, TK_RED);
  399.     glVertex2i(-boxW/8, boxH/16);
  400.     TK_SETCOLOR(windType, TK_BLUE);
  401.     glVertex2i(boxW/8, boxH/16);
  402.     TK_SETCOLOR(windType, TK_WHITE);
  403.     glVertex2i(boxW/4, boxH/4);
  404.     glEnd();
  405.  
  406.     glBegin(GL_QUADS);
  407.     glVertex2i(0, 0);
  408.     glVertex2i(100, 100);
  409.     glVertex2i(-100, 100);
  410.     glEnd();
  411. }
  412.  
  413. static void QuadStrip(void)
  414. {
  415.  
  416.     glBegin(GL_QUAD_STRIP);
  417.     TK_SETCOLOR(windType, TK_GREEN);
  418.     glVertex2i(-boxW/4, -boxH/4);
  419.     TK_SETCOLOR(windType, TK_RED);
  420.     glVertex2i(-boxW/4, boxH/4);
  421.     TK_SETCOLOR(windType, TK_BLUE);
  422.     glVertex2i(0, -boxH/4);
  423.     TK_SETCOLOR(windType, TK_WHITE);
  424.     glVertex2i(0, boxH/4);
  425.     TK_SETCOLOR(windType, TK_CYAN);
  426.     glVertex2i(boxW/4, -boxH/4);
  427.     TK_SETCOLOR(windType, TK_YELLOW);
  428.     glVertex2i(boxW/4, boxH/4);
  429.     glEnd();
  430.  
  431.     glBegin(GL_QUAD_STRIP);
  432.     glVertex2i(0, 0);
  433.     glVertex2i(100, 100);
  434.     glVertex2i(-100, 100);
  435.     glEnd();
  436. }
  437.  
  438. static void Draw(void)
  439. {
  440.  
  441.     glViewport(0, 0, windW, windH);
  442.     glDisable(GL_SCISSOR_TEST);
  443.  
  444.     glPushAttrib(GL_COLOR_BUFFER_BIT);
  445.  
  446.     glColorMask(1, 1, 1, 1);
  447.     glIndexMask(~0);
  448.  
  449.     glClearColor(0.0, 0.0, 0.0, 0.0);
  450.     glClear(GL_COLOR_BUFFER_BIT);
  451.  
  452.     glPopAttrib();
  453.  
  454.     if (mode1) {
  455.     glShadeModel(GL_SMOOTH);
  456.     } else {
  457.     glShadeModel(GL_FLAT);
  458.     }
  459.  
  460.     if (mode2) {
  461.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  462.     } else {
  463.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  464.     }
  465.  
  466.     Viewport(0, 0); Points();
  467.     Viewport(0, 1); Lines();
  468.     Viewport(0, 2); LineStrip();
  469.     Viewport(0, 3); LineLoop();
  470.  
  471.     Viewport(1, 0); Bitmap();
  472.  
  473.     Viewport(1, 1); TriangleFan();
  474.     Viewport(1, 2); Triangles();
  475.     Viewport(1, 3); TriangleStrip();
  476.  
  477.     Viewport(2, 0); Rects();
  478.     Viewport(2, 1); Polygons();
  479.     Viewport(2, 2); Quads();
  480.     Viewport(2, 3); QuadStrip();
  481.  
  482.     tkSwapBuffers();
  483. }
  484.  
  485. static GLenum Args(int argc, char **argv)
  486. {
  487.     GLint i;
  488.  
  489.     rgb = GL_TRUE;
  490.     doubleBuffer = GL_TRUE;
  491.     directRender = GL_TRUE;
  492.  
  493.     for (i = 1; i < argc; i++) {
  494.     if (strcmp(argv[i], "-ci") == 0) {
  495.         rgb = GL_FALSE;
  496.     } else if (strcmp(argv[i], "-rgb") == 0) {
  497.         rgb = GL_TRUE;
  498.     } else if (strcmp(argv[i], "-sb") == 0) {
  499.         doubleBuffer = GL_FALSE;
  500.     } else if (strcmp(argv[i], "-db") == 0) {
  501.         doubleBuffer = GL_TRUE;
  502.     } else if (strcmp(argv[i], "-dr") == 0) {
  503.         directRender = GL_TRUE;
  504.     } else if (strcmp(argv[i], "-ir") == 0) {
  505.         directRender = GL_FALSE;
  506.     } else {
  507.         printf("%s (Bad option).\n", argv[i]);
  508.         return GL_FALSE;
  509.     }
  510.     }
  511.     return GL_TRUE;
  512. }
  513.  
  514. void main(int argc, char **argv)
  515. {
  516.  
  517.     if (Args(argc, argv) == GL_FALSE) {
  518.     tkQuit();
  519.     }
  520.  
  521.     windW = 600;
  522.     windH = 300;
  523.     tkInitPosition(30, 60, windW, windH);
  524.  
  525.     windType = (rgb) ? TK_RGB : TK_INDEX;
  526.     windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  527.     windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  528.     tkInitDisplayMode(windType);
  529.  
  530.     if (tkInitWindow("Primitive Test") == GL_FALSE) {
  531.     tkQuit();
  532.     }
  533.  
  534.     Init();
  535.  
  536.     tkExposeFunc(Reshape);
  537.     tkReshapeFunc(Reshape);
  538.     tkKeyDownFunc(Key);
  539.     tkDisplayFunc(Draw);
  540.     tkExec();
  541. }
  542.